package br.com.peri.conceito.modelo.impl;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;

import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;

import br.com.peri.Pessoa;
import br.com.peri.conceito.exception.ConceitoException;
import br.com.peri.conceito.modelo.PessoaApp;
import br.com.peri.enums.StatusPeriResponse;
import br.com.peri.rs.PessoaResource;
import br.com.peri.vo.PeriResponse;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

@Name(value = "pessoaAppRest")
@Stateless
public class PessoaAppRestBean implements PessoaApp {

	private static final long serialVersionUID = 1L;

	@In(create = true)
	private PessoaResource pessoaResource;

	public Pessoa salvar(Pessoa pessoa) throws ConceitoException {
		Gson gson = new Gson();
		String jsonResponse = pessoaResource.salvarPessoa(gson.toJson(pessoa));
		Type type = new TypeToken<PeriResponse<Pessoa>>() {
		}.getType();
		PeriResponse<Pessoa> PeriResponse = gson.fromJson(jsonResponse,
				type);
		if (StatusPeriResponse.ERRO.equals(PeriResponse.getStatus())) {
			throw new ConceitoException(PeriResponse.getMensagens());
		}
		return PeriResponse.getObjeto();
	}

	public Pessoa atualizar(Pessoa pessoa) throws ConceitoException {
		Gson gson = new Gson();
		String jsonResponse = pessoaResource.atualizarPessoa(gson
				.toJson(pessoa));
		Type type = new TypeToken<PeriResponse<Pessoa>>() {
		}.getType();
		PeriResponse<Pessoa> PeriResponse = gson.fromJson(jsonResponse,
				type);
		if (StatusPeriResponse.ERRO.equals(PeriResponse.getStatus())) {
			throw new ConceitoException(PeriResponse.getMensagens());
		}
		return PeriResponse.getObjeto();
	}

	public void excluir(Pessoa pessoa) throws ConceitoException {
		if (pessoa == null) {
			return;
		}
		Gson gson = new Gson();
		String jsonResponse = pessoaResource.excluirPessoa(pessoa.getId());
		Type type = new TypeToken<PeriResponse<Pessoa>>() {
		}.getType();
		PeriResponse<Pessoa> PeriResponse = gson.fromJson(jsonResponse,
				type);
		if (StatusPeriResponse.ERRO.equals(PeriResponse.getStatus())) {
			throw new ConceitoException(PeriResponse.getMensagens());
		}
	}

	public Pessoa pesquisarPorId(Pessoa pessoa) {
		if (pessoa == null) {
			return null;
		}
		String jsonResponse = pessoaResource.getPessoaPorId(pessoa.getId());
		return new Gson().fromJson(jsonResponse, Pessoa.class);
	}

	public List<Pessoa> pesquisarPorParamentros(Pessoa pessoa) {
		if (pessoa == null) {
			return new ArrayList<Pessoa>(0);
		}
		String jsonResponse = pessoaResource.listarPessoas(pessoa.getNome(),
				pessoa.getCpf(), pessoa.getCnpj());
		Type type = new TypeToken<List<Pessoa>>() {
		}.getType();
		return new Gson().fromJson(jsonResponse, type);
	}

}